home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / crayola / common / crayMesh.c < prev    next >
C/C++ Source or Header  |  1993-01-15  |  4KB  |  152 lines

  1. #include "ooglutil.h"
  2. #include "geom.h"
  3. #include "meshP.h"
  4. #include "crayolaP.h"
  5.  
  6. static char msg[] = "crayMesh.c";
  7.  
  8. void *cray_mesh_HasVColor(int sel, Geom *geom, va_list args);
  9. void *cray_mesh_UseVColor(int sel, Geom *geom, va_list args);
  10. void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list args);
  11. void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list args);
  12. void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list args);
  13. void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list args);
  14. void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list args);
  15. void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list args);
  16. void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list args);
  17.  
  18. #define MAX_METHODS 11
  19.  
  20. static craySpecFunc methods[] = {
  21.   "crayHasColor", cray_mesh_HasVColor,
  22.   "crayHasVColor", cray_mesh_HasVColor,
  23.   "crayCanUseVColor", crayTrue,
  24.   "crayUseVColor", cray_mesh_UseVColor,
  25.   "crayEliminateColor", cray_mesh_EliminateColor,
  26.   "craySetColorAll", cray_mesh_SetColorAll,
  27.   "craySetColorAt", cray_mesh_SetColorAt,
  28.   "craySetColorAtF", cray_mesh_SetColorAtF,
  29.   "craySetColorAtV", cray_mesh_SetColorAtV,
  30.   "crayGetColorAt", cray_mesh_GetColorAt,
  31.   "crayGetColorAtV", cray_mesh_GetColorAtV
  32.   };
  33.  
  34. cray_mesh_init() {
  35.   crayInitSpec(methods, MAX_METHODS, GeomClassLookup("mesh"));
  36.   return 0;
  37. }
  38.  
  39. void *cray_mesh_HasVColor(int sel, Geom *geom, va_list args) {
  40.   Mesh *m = (Mesh *)geom;
  41.   return (void *)(m->flag & MESH_C);
  42. }
  43.  
  44. void *cray_mesh_UseVColor(int sel, Geom *geom, va_list args) {
  45.   int i;
  46.   Mesh *m = (Mesh *)geom;
  47.   ColorA *def;
  48.  
  49.   if (crayHasVColor(geom, NULL)) return 0;
  50.  
  51.   def = va_arg(args, ColorA *);
  52.  
  53.   m->c = OOGLNewNE(ColorA, m->nu * m->nv, msg);
  54.   for (i = 0; i < m->nu * m->nv; i++) {
  55.     m->c[i].r = def->r;
  56.     m->c[i].g = def->g;
  57.     m->c[i].b = def->b;
  58.     m->c[i].a = def->a;
  59.   }
  60.   m->flag |= MESH_C;
  61.   return (void *)geom;
  62. }
  63.  
  64. void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list args) {
  65.   Mesh *m = (Mesh *)geom;
  66.   
  67.   if (!crayHasColor(geom, NULL)) return 0;
  68.   
  69.   OOGLFree(m->c);
  70.   m->c = NULL;
  71.   m->flag ^= MESH_C;
  72.   return (void *)geom;
  73. }
  74.  
  75. void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list args) {
  76.   int i;
  77.   Mesh *m = (Mesh *)geom;
  78.   ColorA *color;
  79.  
  80.   if (!crayHasVColor(geom, NULL)) return NULL;
  81.   color = va_arg(args, ColorA *);
  82.   for (i = 0; i < m->nu * m->nv; i++) m->c[i] = *color;
  83.   return (void *)geom;
  84. }
  85.  
  86. void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list args) {
  87.   ColorA *color;
  88.   int vindex, findex;
  89.   color = va_arg(args, ColorA *);
  90.   vindex = va_arg(args, int);
  91.   findex = va_arg(args, int);
  92.   if (vindex != -1) 
  93.     return (void *)craySetColorAtV(geom, color, vindex, NULL, NULL);
  94.   return (void *)craySetColorAtF(geom, color, findex, NULL);
  95. }
  96.  
  97. void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list args) {
  98.   Mesh *m = (Mesh *)geom;
  99.   ColorA *color;
  100.   int index;
  101.  
  102.   color = va_arg(args, ColorA *);
  103.   index = va_arg(args, int);
  104.   if (!crayHasVColor(geom, NULL) || index == -1) return 0;
  105.   m->c[index].r = color->r;
  106.   m->c[index].g = color->g;
  107.   m->c[index].b = color->b;
  108.   m->c[index].a = color->a;
  109.   return (void *)color;
  110. }
  111.  
  112. void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list args) {
  113.   Mesh *m = (Mesh *)geom;
  114.   ColorA *color;
  115.   int index, u, v;
  116.  
  117.   color = va_arg(args, ColorA *);
  118.   index = va_arg(args, int);
  119.   if (!crayHasColor(geom, NULL) || index == -1) return 0;
  120.  
  121.   u = index % m->nu;
  122.   v = index / m->nu;
  123.  
  124.   m->c[MESHINDEX(u, v, m)] = *color;
  125.   m->c[MESHINDEX(u+1, v, m)] = *color;
  126.   m->c[MESHINDEX(u+1, v+1, m)] = *color;
  127.   m->c[MESHINDEX(u, v+1, m)] = *color;
  128.   return (void *)m;
  129. }
  130.  
  131. void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list args) {
  132.   ColorA *color;
  133.   int i;
  134.   color = va_arg(args, ColorA *);
  135.   i = va_arg(args, int);
  136.   return (void *)crayGetColorAtV(geom, color, i, NULL, NULL);
  137. }
  138.      
  139. void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list args) {
  140.  ColorA *color;
  141.  int i;
  142.  Mesh *m = (Mesh *)geom;
  143.  if (!crayHasVColor(geom, NULL)) return 0;
  144.  color = va_arg(args, ColorA *);
  145.  i = va_arg(args, int);
  146.  color->r = m->c[i].r;
  147.  color->g = m->c[i].g;
  148.  color->b = m->c[i].b;
  149.  color->a = m->c[i].a;
  150.  return (void *)color;
  151. }
  152.